home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / gtlayout-Source.lha / LT_HandleInput.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-18  |  34.0 KB  |  1,545 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1994 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. VOID LIBENT
  10. LT_HandleInput(REG(a0) LayoutHandle *Handle,REG(d0) ULONG MsgQualifier,REG(a1) ULONG *MsgClass,REG(a2) UWORD *MsgCode,REG(a3) struct Gadget **MsgGadget)
  11. {
  12.     ObjectNode    *Node;
  13.     BOOLEAN      Activate = FALSE;
  14.  
  15.     if(!Handle)
  16.         return;
  17.  
  18.     switch(*MsgClass)
  19.     {
  20.         case IDCMP_NEWSIZE:
  21.  
  22.                 // Did the user cancel the resize operation?
  23.  
  24.             if(Handle -> SizeVerified && Handle -> SizeWidth == Handle -> Window -> Width && Handle -> SizeHeight == Handle -> Window -> Height)
  25.             {
  26.                 Handle -> SizeVerified    = FALSE;
  27.                 Handle -> SizeWidth    = 0;
  28.                 Handle -> SizeHeight    = 0;
  29.  
  30.                     // Put the gadgets back in
  31.  
  32.                 AddGList(Handle -> Window,Handle -> List,(UWORD)-1,(UWORD)-1,NULL);
  33.             }
  34.             else
  35.             {
  36.                 struct IBox Box;
  37.  
  38.                 Handle -> SizeWidth    = 0;
  39.                 Handle -> SizeHeight    = 0;
  40.  
  41.                 Box . Left    = 0;
  42.                 Box . Top    = 0;
  43.                 Box . Width    = Handle -> Window -> Width - (Handle -> Window -> BorderRight + Handle -> Screen -> WBorRight);
  44.                 Box . Height    = Handle -> Window -> Height - (Handle -> Window -> BorderBottom + Handle -> Screen -> WBorBottom);
  45.  
  46.                 LT_LockWindow(Handle -> Window);
  47.  
  48.                 if(Handle -> ResizeView)
  49.                     Handle -> ResizeView -> Special . List . IgnoreListContents = TRUE;
  50.  
  51.                 LT_RebuildTags(Handle,TRUE,
  52.                     LAWN_Bounds,    &Box,
  53.                 TAG_DONE);
  54.  
  55.                 LT_UnlockWindow(Handle -> Window);
  56.  
  57.                 if(Handle -> Failed)
  58.                     *MsgClass = IDCMP_CLOSEWINDOW;
  59.                 else
  60.                     *MsgClass = NULL;
  61.             }
  62.  
  63.             break;
  64.  
  65.         case IDCMP_REFRESHWINDOW:
  66.  
  67.             if(Handle -> AutoRefresh)
  68.             {
  69.                 LT_BeginRefresh(Handle);
  70.  
  71.                 LT_EndRefresh(Handle,TRUE);
  72.  
  73.                 *MsgClass = NULL;
  74.             }
  75.  
  76.             break;
  77.  
  78.         case IDCMP_INTUITICKS:
  79.  
  80.             if(Handle -> ActiveIncrementer)
  81.             {
  82.                 Handle -> IncrementerCountdown--;
  83.  
  84.                 if(Handle -> IncrementerCountdown <= 0)
  85.                 {
  86.                     if(Handle -> ActiveIncrementer -> Host -> Flags & GFLG_SELECTED)
  87.                     {
  88.                         struct ObjectNode    *Parent;
  89.                         LONG             Number;
  90.  
  91.                         *MsgClass    = IDCMP_GADGETUP;
  92.                         *MsgCode    = 0;
  93.                         *MsgGadget    = Handle -> ActiveIncrementer -> Special . Incrementer . Parent;
  94.  
  95.                         Parent = (*MsgGadget) -> UserData;
  96.  
  97.                         if(Parent -> Special . Integer . IncrementerHook)
  98.                             Number = CallHookPkt(Parent -> Special . Integer . IncrementerHook,(APTR)LT_GetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,TAG_DONE),Handle -> ActiveIncrementer -> Special . Incrementer . Amount < 0 ? (APTR)INCREMENTERMSG_DECREMENT : (APTR)INCREMENTERMSG_INCREMENT);
  99.                         else
  100.                             Number = ((LONG)LT_GetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,TAG_DONE)) + Handle -> ActiveIncrementer -> Special . Incrementer . Amount;
  101.  
  102.                         if(Number >= Parent -> Min && Number <= Parent -> Max)
  103.                             LT_SetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,GTIN_Number,Number,TAG_DONE);
  104.                     }
  105.  
  106.                     Handle -> IncrementerCountdown = 2;
  107.                 }
  108.             }
  109.  
  110.             break;
  111.  
  112.         case IDCMP_RAWKEY:
  113.         {
  114.             UBYTE            Buffer[10],Key;
  115.             struct InputEvent    event;
  116.             BOOLEAN         KeyUp;
  117.  
  118.             if((*MsgCode & ~IECODE_UP_PREFIX) == 95 && Handle -> HelpHook)
  119.             {
  120.                 if(!(*MsgCode & IECODE_UP_PREFIX))
  121.                 {
  122.                     ObjectNode    *Item;
  123.                     struct HelpMsg     Message;
  124.                     struct IBox     Box;
  125.  
  126.                     if(Item = LTP_FindNode_Position(Handle -> TopGroup,Handle -> Window -> MouseX,Handle -> Window -> MouseY))
  127.                     {
  128.                         Message . ObjectID = Item -> ID;
  129.  
  130.                         Box . Left    = Item -> Left;
  131.                         Box . Top    = Item -> Top;
  132.                         Box . Width    = Item -> Width;
  133.                         Box . Height    = Item -> Height;
  134.                     }
  135.                     else
  136.                     {
  137.                         Message . ObjectID = -1;
  138.  
  139.                         Box . Left    = 0;
  140.                         Box . Top    = 0;
  141.                         Box . Width    = Handle -> Window -> Width;
  142.                         Box . Height    = Handle -> Window -> Height;
  143.                     }
  144.  
  145.                     Message . Handle = Handle;
  146.  
  147.                     CallHookPkt(Handle -> HelpHook,&Message,&Box);
  148.                 }
  149.  
  150.                 *MsgClass = NULL;
  151.  
  152.                 break;
  153.             }
  154.  
  155.             if((*MsgCode >= 99 && *MsgCode <= 103) || *MsgCode == 96 || *MsgCode == 97)
  156.             {
  157.                 *MsgClass = NULL;
  158.  
  159.                 break;
  160.             }
  161.  
  162.             event . ie_NextEvent        = NULL;
  163.             event . ie_Code         = (*MsgCode) & ~IECODE_UP_PREFIX;
  164.             event . ie_Qualifier        = MsgQualifier & ~QUALIFIER_SHIFT;
  165.             event . ie_Class        = IECLASS_RAWKEY;
  166.             event . ie_SubClass        = 0;
  167.             event . ie_position . ie_addr    = (APTR)*MsgGadget;
  168.  
  169.             Buffer[0] = 0;
  170.  
  171.             if(MapRawKey(&event,Buffer,9,NULL) < 1)
  172.             {
  173.                 *MsgClass = NULL;
  174.  
  175.                 break;
  176.             }
  177.  
  178.             if(!(Key = Buffer[0]))
  179.             {
  180.                 *MsgClass = NULL;
  181.  
  182.                 break;
  183.             }
  184.  
  185.             if((*MsgCode) & IECODE_UP_PREFIX)
  186.                 KeyUp = TRUE;
  187.             else
  188.                 KeyUp = FALSE;
  189.  
  190.             if(!KeyUp && Handle -> CursorKey && (*MsgCode == CURSORUP || *MsgCode == CURSORDOWN))
  191.             {
  192.                 ObjectNode    *Node;
  193.                 struct Gadget    *Gadget;
  194.                 LONG         NewState;
  195.  
  196.                 Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  197.  
  198.                 Node        = Handle -> CursorKey;
  199.                 Gadget        = Node -> Host;
  200.                 NewState    = Node -> Current;
  201.  
  202.                 if(*MsgCode == CURSORDOWN)
  203.                 {
  204.                     if(MsgQualifier & QUALIFIER_SHIFT)
  205.                         NewState += Node -> Lines;
  206.                     else
  207.                     {
  208.                         if(MsgQualifier & (QUALIFIER_ALT | QUALIFIER_CONTROL))
  209.                             NewState = Node -> Max;
  210.                         else
  211.                             NewState++;
  212.                     }
  213.                 }
  214.                 else
  215.                 {
  216.                     if(MsgQualifier & QUALIFIER_SHIFT)
  217.                         NewState -= Node -> Lines;
  218.                     else
  219.                     {
  220.                         if(MsgQualifier & (QUALIFIER_ALT | QUALIFIER_CONTROL))
  221.                             NewState = Node -> Min;
  222.                         else
  223.                             NewState--;
  224.                     }
  225.                 }
  226.  
  227.                 if(NewState < Node -> Min)
  228.                     NewState = Node -> Min;
  229.                 else
  230.                 {
  231.                     if(NewState > Node -> Max)
  232.                         NewState = Node -> Max;
  233.                 }
  234.  
  235.                 if(NewState != Node -> Current && Node -> Max != Node -> Min)
  236.                 {
  237.                     Node -> Current = NewState;
  238.  
  239.                     GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  240.                         GTLV_Top,        Node -> Current,
  241.                         GTLV_MakeVisible,    Node -> Current,
  242.  
  243.                         Node -> Special . List . LinkID != -1 ? GTLV_Selected : TAG_IGNORE,Node -> Current,
  244.                     TAG_DONE);
  245.  
  246.                     LTP_PutStorage(Node);
  247.  
  248.                     *MsgClass    = IDCMP_GADGETUP;
  249.                     *MsgCode    = Node -> Current;
  250.                     *MsgGadget    = Gadget;
  251.                 }
  252.                 else
  253.                     *MsgClass = NULL;
  254.  
  255.                 return;
  256.             }
  257.  
  258.             if(Key == '\t' && !KeyUp)
  259.             {
  260.                 ObjectNode *Node;
  261.  
  262.                 *MsgClass = NULL;
  263.  
  264.                 if(Node = Handle -> TabKey)
  265.                 {
  266.                     if(!(Node -> Disabled))
  267.                     {
  268.                         LONG Choice;
  269.  
  270.                         if(MsgQualifier & QUALIFIER_SHIFT)
  271.                             Choice = Node -> Current - 1;
  272.                         else
  273.                             Choice = Node -> Current + 1;
  274.  
  275.                         if(Choice < Node -> Min)
  276.                             Choice = Node -> Max;
  277.                         else
  278.                         {
  279.                             if(Choice > Node -> Max)
  280.                                 Choice = Node -> Min;
  281.                         }
  282.  
  283.                         if(Choice != Node -> Current)
  284.                         {
  285.                             LONG AutoPageID,Type;
  286.  
  287.                             if(Node -> Type == CYCLE_KIND)
  288.                             {
  289.                                 AutoPageID    = Node -> Special . Cycle . AutoPageID;
  290.                                 Type        = GTCY_Active;
  291.                                 *MsgClass    = IDCMP_GADGETUP;
  292.  
  293.                                 LTP_BlinkButton(Handle,Node -> Host);
  294.                             }
  295.                             else
  296.                             {
  297.                                 AutoPageID    = Node -> Special . Radio . AutoPageID;
  298.                                 Type        = GTMX_Active;
  299.                                 *MsgClass    = IDCMP_GADGETDOWN;
  300.                             }
  301.  
  302.                             *MsgCode    = (UWORD)Choice;
  303.                             *MsgGadget    = Node -> Host;
  304.  
  305.                             LT_SetAttributes(Handle,Node -> ID,
  306.                                 Type,Choice,
  307.                             TAG_DONE);
  308.  
  309.                             if(AutoPageID != -1)
  310.                             {
  311.                                 LT_SetAttributes(Handle,AutoPageID,
  312.                                     LAGR_ActivePage,Choice,
  313.                                 TAG_DONE);
  314.  
  315.                                 if(Handle -> Failed)
  316.                                     *MsgClass = IDCMP_CLOSEWINDOW;
  317.                             }
  318.                         }
  319.                     }
  320.                 }
  321.  
  322.                 return;
  323.             }
  324.  
  325.             if(Key == '\33' && !KeyUp)
  326.             {
  327.                 ObjectNode *Node;
  328.  
  329.                 Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  330.  
  331.                 if(Node = Handle -> EscKey)
  332.                 {
  333.                     if(!Node -> Disabled)
  334.                     {
  335.                         LTP_BlinkButton(Handle,Node -> Host);
  336.  
  337.                         *MsgCode    = 0;
  338.                         *MsgGadget    = Node -> Host;
  339.                         *MsgClass    = IDCMP_GADGETUP;
  340.                     }
  341.                     else
  342.                         *MsgClass = NULL;
  343.  
  344.                     return;
  345.                 }
  346.  
  347.                 if(Handle -> Window -> Flags & WFLG_CLOSEGADGET)
  348.                 {
  349.                     *MsgCode    = 0;
  350.                     *MsgGadget    = NULL;
  351.                     *MsgClass    = IDCMP_CLOSEWINDOW;
  352.                 }
  353.                 else
  354.                     *MsgClass = NULL;
  355.  
  356.                 return;
  357.             }
  358.             else
  359.             {
  360.                 struct Gadget    *Gadget;
  361.                 ObjectNode    *Node;
  362.                 LONG         i;
  363.                 BOOLEAN      FoundIt = FALSE,
  364.                          Forward;
  365.  
  366.                 if(MsgQualifier & QUALIFIER_SHIFT)
  367.                     Forward = FALSE;
  368.                 else
  369.                     Forward = TRUE;
  370.  
  371.                 if(Handle -> ReturnKey && Key == '\r')
  372.                 {
  373.                     Node = Handle -> ReturnKey;
  374.  
  375.                     if(!KeyUp && !Node -> Disabled)
  376.                     {
  377.                         LTP_BlinkButton(Handle,Node -> Host);
  378.  
  379.                         *MsgClass    = IDCMP_GADGETUP;
  380.                         *MsgCode    = 0;
  381.                         *MsgGadget    = Node -> Host;
  382.                     }
  383.                     else
  384.                         *MsgClass = NULL;
  385.  
  386.                     Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  387.  
  388.                     return;
  389.                 }
  390.  
  391.                 for(i = 0 ; !FoundIt && i < Handle -> Count ; i++)
  392.                 {
  393.                     if(Gadget = Handle -> GadgetArray[i])
  394.                     {
  395.                         if(GETOBJECT(Gadget,Node))
  396.                         {
  397.                             if(Key == Node -> Key)
  398.                             {
  399.                                 if(Node -> Disabled)
  400.                                     break;
  401.                                 else
  402.                                 {
  403.                                     switch(Node -> Type)
  404.                                     {
  405. #ifdef DO_TAPEDECK_KIND
  406.                                         case TAPEDECK_KIND:
  407.  
  408.                                             if(!KeyUp && !(MsgQualifier & IEQUALIFIER_REPEAT))
  409.                                             {
  410.                                                 if(Node -> Special . TapeDeck . Toggle)
  411.                                                 {
  412.                                                     LT_SetAttributes(Handle,Node -> ID,
  413.                                                         LAPR_Object,    Node,
  414.                                                         LATD_Pressed,    !Node -> Current,
  415.                                                     TAG_DONE);
  416.  
  417.                                                     LTP_PutStorage(Node);
  418.                                                 }
  419.                                                 else
  420.                                                     LTP_BlinkButton(Handle,Gadget);
  421.  
  422.                                                 if(Gadget -> Flags & GFLG_SELECTED)
  423.                                                     *MsgCode = TRUE;
  424.                                                 else
  425.                                                     *MsgCode = FALSE;
  426.  
  427.                                                 *MsgClass    = IDCMP_GADGETUP;
  428.                                                 *MsgGadget    = Gadget;
  429.                                             }
  430.                                             else
  431.                                                 *MsgClass = NULL;
  432.  
  433.                                             break;
  434. #endif    /* DO_TAPEDECK_KIND */
  435.                                         case CHECKBOX_KIND:
  436.  
  437.                                             if(!KeyUp && !(MsgQualifier & IEQUALIFIER_REPEAT))
  438.                                             {
  439.                                                 Node -> Current = !Node -> Current;
  440.  
  441.                                                 LTP_PutStorage(Node);
  442.  
  443.                                                 GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  444.                                                     GTCB_Checked,Node -> Current,
  445.                                                 TAG_DONE);
  446.  
  447.                                                 *MsgClass    = IDCMP_GADGETUP;
  448.                                                 *MsgCode    = Node -> Current;
  449.                                                 *MsgGadget    = Gadget;
  450.                                             }
  451.                                             else
  452.                                                 *MsgClass = NULL;
  453.  
  454.                                             FoundIt = TRUE;
  455.  
  456.                                             break;
  457.  
  458.                                         case LISTVIEW_KIND:
  459.  
  460.                                             if(!KeyUp)
  461.                                             {
  462.                                                 BOOLEAN setAttrs = FALSE;
  463.  
  464.                                                 if(Forward)
  465.                                                 {
  466.                                                     if(Node -> Current < Node -> Max)
  467.                                                     {
  468.                                                         Node -> Current++;
  469.  
  470.                                                         setAttrs = TRUE;
  471.                                                     }
  472.                                                 }
  473.                                                 else
  474.                                                 {
  475.                                                     if(Node -> Current > Node -> Min)
  476.                                                     {
  477.                                                         Node -> Current--;
  478.  
  479.                                                         setAttrs = TRUE;
  480.                                                     }
  481.                                                 }
  482.  
  483.                                                 if(setAttrs)
  484.                                                 {
  485.                                                     if(Node -> Current < 0)
  486.                                                     {
  487.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  488.                                                             GTLV_Selected,Node -> Current,
  489.                                                         TAG_DONE);
  490.                                                     }
  491.                                                     else
  492.                                                     {
  493.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  494.                                                             GTLV_Top,        Node -> Current,
  495.                                                             GTLV_MakeVisible,    Node -> Current,
  496.                                                             Node -> Special . List . LinkID != -1 ? GTLV_Selected : TAG_IGNORE,Node -> Current,
  497.                                                         TAG_DONE);
  498.                                                     }
  499.  
  500.                                                     LTP_PutStorage(Node);
  501.  
  502.                                                     *MsgClass    = IDCMP_GADGETUP;
  503.                                                     *MsgCode    = Node -> Current;
  504.                                                     *MsgGadget    = Gadget;
  505.                                                 }
  506.                                                 else
  507.                                                     *MsgClass = NULL;
  508.                                             }
  509.                                             else
  510.                                                 *MsgClass = NULL;
  511.  
  512.                                             FoundIt = TRUE;
  513.  
  514.                                             break;
  515.  
  516.                                         case MX_KIND:
  517.  
  518.                                             if(!KeyUp)
  519.                                             {
  520.                                                 if(Forward)
  521.                                                 {
  522.                                                     if(Node -> Current < Node -> Max)
  523.                                                     {
  524.                                                         Node -> Current++;
  525.  
  526.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  527.                                                             GTMX_Active,Node -> Current,
  528.                                                         TAG_DONE);
  529.  
  530.                                                         LTP_PutStorage(Node);
  531.  
  532.                                                         *MsgClass    = IDCMP_GADGETDOWN;
  533.                                                         *MsgCode    = Node -> Current;
  534.                                                         *MsgGadget    = Gadget;
  535.                                                     }
  536.                                                     else
  537.                                                         *MsgClass = NULL;
  538.                                                 }
  539.                                                 else
  540.                                                 {
  541.                                                     if(Node -> Current > Node -> Min)
  542.                                                     {
  543.                                                         Node -> Current--;
  544.  
  545.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  546.                                                             GTMX_Active,Node -> Current,
  547.                                                         TAG_DONE);
  548.  
  549.                                                         LTP_PutStorage(Node);
  550.  
  551.                                                         *MsgClass    = IDCMP_GADGETDOWN;
  552.                                                         *MsgCode    = Node -> Current;
  553.                                                         *MsgGadget    = Gadget;
  554.                                                     }
  555.                                                     else
  556.                                                         *MsgClass = NULL;
  557.                                                 }
  558.                                             }
  559.                                             else
  560.                                                 *MsgClass = NULL;
  561.  
  562.                                             if(*MsgClass)
  563.                                             {
  564.                                                 if(Node -> Special . Radio . AutoPageID != -1)
  565.                                                 {
  566.                                                     LT_SetAttributes(Handle,Node -> Special . Radio . AutoPageID,
  567.                                                         LAGR_ActivePage,Node -> Current,
  568.                                                     TAG_DONE);
  569.  
  570.                                                     if(Handle -> Failed)
  571.                                                         *MsgClass = IDCMP_CLOSEWINDOW;
  572.                                                     else
  573.                                                         *MsgClass = NULL;
  574.                                                 }
  575.                                             }
  576.  
  577.                                             FoundIt = TRUE;
  578.  
  579.                                             break;
  580.  
  581.                                         case TEXT_KIND:
  582.  
  583.                                             if(!KeyUp && !(MsgQualifier & IEQUALIFIER_REPEAT))
  584.                                             {
  585.                                                 if(Node -> Special . Text . Picker)
  586.                                                 {
  587.                                                     LTP_BlinkButton(Handle,Node -> Special . Text . Picker);
  588.  
  589.                                                     *MsgClass    = IDCMP_IDCMPUPDATE;
  590.                                                     *MsgCode    = 0;
  591.                                                     *MsgGadget    = Gadget;
  592.                                                 }
  593.                                                 else
  594.                                                     *MsgClass = NULL;
  595.                                             }
  596.                                             else
  597.                                                 *MsgClass = NULL;
  598.  
  599.                                             FoundIt = TRUE;
  600.  
  601.                                             break;
  602.  
  603.                                         case NUMBER_KIND:
  604.  
  605.                                             *MsgClass = NULL;
  606.  
  607.                                             FoundIt = TRUE;
  608.  
  609.                                             break;
  610.  
  611.                                         case CYCLE_KIND:
  612.  
  613.                                             if(!KeyUp && !(MsgQualifier & IEQUALIFIER_REPEAT))
  614.                                             {
  615.                                                 LTP_BlinkButton(Handle,Gadget);
  616.  
  617.                                                 if(Forward)
  618.                                                 {
  619.                                                     if(Node -> Current < Node -> Max)
  620.                                                         Node -> Current++;
  621.                                                     else
  622.                                                         Node -> Current = Node -> Min;
  623.                                                 }
  624.                                                 else
  625.                                                 {
  626.                                                     if(Node -> Current > Node -> Min)
  627.                                                         Node -> Current--;
  628.                                                     else
  629.                                                         Node -> Current = Node -> Max;
  630.                                                 }
  631.  
  632.                                                 LTP_PutStorage(Node);
  633.  
  634.                                                 GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  635.                                                     GTCY_Active,Node -> Current,
  636.                                                 TAG_DONE);
  637.  
  638.                                                 *MsgClass    = IDCMP_GADGETUP;
  639.                                                 *MsgCode    = Node -> Current;
  640.                                                 *MsgGadget    = Gadget;
  641.  
  642.                                                 if(Node -> Special . Cycle . AutoPageID != -1)
  643.                                                 {
  644.                                                     LT_SetAttributes(Handle,Node -> Special . Cycle . AutoPageID,
  645.                                                         LAGR_ActivePage,Node -> Current,
  646.                                                     TAG_DONE);
  647.  
  648.                                                     if(Handle -> Failed)
  649.                                                         *MsgClass = IDCMP_CLOSEWINDOW;
  650.                                                     else
  651.                                                         *MsgClass = NULL;
  652.                                                 }
  653.                                             }
  654.                                             else
  655.                                                 *MsgClass = NULL;
  656.  
  657.                                             FoundIt = TRUE;
  658.  
  659.                                             break;
  660.  
  661.                                         case PALETTE_KIND:
  662.  
  663.                                             if(!KeyUp)
  664.                                             {
  665.                                                 if(Node -> Special . Palette . TranslateBack)
  666.                                                 {
  667.                                                     LONG Index = Node -> Special . Palette . TranslateBack[Node -> Current];
  668.  
  669.                                                     if(Index < Node -> Min)
  670.                                                         Index = Node -> Min;
  671.                                                     else
  672.                                                     {
  673.                                                         if(Index > Node -> Max)
  674.                                                             Index = Node -> Max;
  675.                                                     }
  676.  
  677.                                                     if(Forward)
  678.                                                     {
  679.                                                         if(Index < Node -> Max)
  680.                                                             Index++;
  681.                                                         else
  682.                                                             Index = Node -> Min;
  683.                                                     }
  684.                                                     else
  685.                                                     {
  686.                                                         if(Index > Node -> Min)
  687.                                                             Index--;
  688.                                                         else
  689.                                                             Index = Node -> Max;
  690.                                                     }
  691.  
  692.                                                     if(Index < Node -> Min)
  693.                                                         Index = Node -> Min;
  694.                                                     else
  695.                                                     {
  696.                                                         if(Index > Node -> Max)
  697.                                                             Index = Node -> Max;
  698.                                                     }
  699.  
  700.                                                     Node -> Current = Node -> Special . Palette . ColourTable[Index];
  701.                                                 }
  702.                                                 else
  703.                                                 {
  704.                                                     if(Forward)
  705.                                                     {
  706.                                                         if(Node -> Current < Node -> Max)
  707.                                                             Node -> Current++;
  708.                                                         else
  709.                                                             Node -> Current = Node -> Min;
  710.                                                     }
  711.                                                     else
  712.                                                     {
  713.                                                         if(Node -> Current > Node -> Min)
  714.                                                             Node -> Current--;
  715.                                                         else
  716.                                                             Node -> Current = Node -> Max;
  717.                                                     }
  718.                                                 }
  719.  
  720.                                                 LTP_PutStorage(Node);
  721.  
  722.                                                 GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  723.                                                     GTPA_Color,Node -> Current,
  724.                                                 TAG_DONE);
  725.  
  726.                                                 *MsgClass    = IDCMP_GADGETUP;
  727.                                                 *MsgCode    = Node -> Current;
  728.                                                 *MsgGadget    = Gadget;
  729.                                             }
  730.                                             else
  731.                                                 *MsgClass = NULL;
  732.  
  733.                                             FoundIt = TRUE;
  734.  
  735.                                             break;
  736.  
  737.                                         case SLIDER_KIND:
  738.  
  739.                                             if(KeyUp)
  740.                                             {
  741.                                                 *MsgClass    = IDCMP_GADGETUP;
  742.                                                 *MsgCode    = Node -> Current;
  743.                                                 *MsgGadget    = Gadget;
  744.                                             }
  745.                                             else
  746.                                             {
  747.                                                 if(Forward)
  748.                                                 {
  749.                                                     if(Node -> Current < Node -> Max)
  750.                                                     {
  751.                                                         Node -> Current++;
  752.  
  753.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  754.                                                             GTSL_Level,Node -> Current,
  755.                                                         TAG_DONE);
  756.  
  757.                                                         LTP_PutStorage(Node);
  758.  
  759.                                                         *MsgClass    = IDCMP_MOUSEMOVE;
  760.                                                         *MsgCode    = Node -> Current;
  761.                                                         *MsgGadget    = Gadget;
  762.                                                     }
  763.                                                     else
  764.                                                         *MsgClass = NULL;
  765.                                                 }
  766.                                                 else
  767.                                                 {
  768.                                                     if(Node -> Current > Node -> Min)
  769.                                                     {
  770.                                                         Node -> Current--;
  771.  
  772.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  773.                                                             GTSL_Level,Node -> Current,
  774.                                                         TAG_DONE);
  775.  
  776.                                                         LTP_PutStorage(Node);
  777.  
  778.                                                         *MsgClass    = IDCMP_MOUSEMOVE;
  779.                                                         *MsgCode    = Node -> Current;
  780.                                                         *MsgGadget    = Gadget;
  781.                                                     }
  782.                                                     else
  783.                                                         *MsgClass = NULL;
  784.                                                 }
  785.                                             }
  786.  
  787.                                             FoundIt = TRUE;
  788.  
  789.                                             break;
  790.  
  791. #ifdef DO_LEVEL_KIND
  792.                                         case LEVEL_KIND:
  793.  
  794.                                             if(KeyUp)
  795.                                             {
  796.                                                 *MsgClass    = IDCMP_GADGETUP;
  797.                                                 *MsgCode    = Node -> Special . Level . Level;
  798.                                                 *MsgGadget    = Gadget;
  799.  
  800.                                                 LTP_PutStorage(Node);
  801.                                             }
  802.                                             else
  803.                                             {
  804.                                                 if(Forward)
  805.                                                 {
  806.                                                     if(Node -> Special . Level . Level < Node -> Special . Level . Max)
  807.                                                     {
  808.                                                         Node -> Special . Level . Level++;
  809.  
  810.                                                         LT_SetAttributes(Handle,Node -> ID,
  811.                                                             LAPR_Object,    Node,
  812.                                                             LAVL_Level,    Node -> Special . Level . Level,
  813.                                                         TAG_DONE);
  814.  
  815.                                                         LTP_PutStorage(Node);
  816.  
  817.                                                         *MsgClass    = IDCMP_MOUSEMOVE;
  818.                                                         *MsgCode    = Node -> Special . Level . Level;
  819.                                                         *MsgGadget    = Gadget;
  820.                                                     }
  821.                                                     else
  822.                                                         *MsgClass = NULL;
  823.                                                 }
  824.                                                 else
  825.                                                 {
  826.                                                     if(Node -> Special . Level . Level > Node -> Special . Level . Min)
  827.                                                     {
  828.                                                         Node -> Special . Level . Level--;
  829.  
  830.                                                         LT_SetAttributes(Handle,Node -> ID,
  831.                                                             LAPR_Object,    Node,
  832.                                                             LAVL_Level,    Node -> Special . Level . Level,
  833.                                                         TAG_DONE);
  834.  
  835.                                                         LTP_PutStorage(Node);
  836.  
  837.                                                         *MsgClass    = IDCMP_MOUSEMOVE;
  838.                                                         *MsgCode    = Node -> Special . Level . Level;
  839.                                                         *MsgGadget    = Gadget;
  840.                                                     }
  841.                                                     else
  842.                                                         *MsgClass = NULL;
  843.                                                 }
  844.                                             }
  845.  
  846.                                             FoundIt = TRUE;
  847.  
  848.                                             break;
  849. #endif    /* DO_LEVEL_KIND */
  850.                                         case SCROLLER_KIND:
  851.  
  852.                                             if(KeyUp)
  853.                                             {
  854.                                                 *MsgClass    = IDCMP_GADGETUP;
  855.                                                 *MsgCode    = Node -> Current;
  856.                                                 *MsgGadget    = Gadget;
  857.                                             }
  858.                                             else
  859.                                             {
  860.                                                 if(Forward)
  861.                                                 {
  862.                                                     if(Node -> Current < Node -> Max)
  863.                                                     {
  864.                                                         Node -> Current++;
  865.  
  866.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  867.                                                             GTSC_Top,Node -> Current,
  868.                                                         TAG_DONE);
  869.  
  870.                                                         LTP_PutStorage(Node);
  871.  
  872.                                                         *MsgClass    = IDCMP_MOUSEMOVE;
  873.                                                         *MsgCode    = Node -> Current;
  874.                                                         *MsgGadget    = Gadget;
  875.                                                     }
  876.                                                     else
  877.                                                         *MsgClass = NULL;
  878.                                                 }
  879.                                                 else
  880.                                                 {
  881.                                                     if(Node -> Current > Node -> Min)
  882.                                                     {
  883.                                                         Node -> Current--;
  884.  
  885.                                                         GT_SetGadgetAttrs(Gadget,Handle -> Window,NULL,
  886.                                                             GTSC_Top,Node -> Current,
  887.                                                         TAG_DONE);
  888.  
  889.                                                         LTP_PutStorage(Node);
  890.  
  891.                                                         *MsgClass    = IDCMP_MOUSEMOVE;
  892.                                                         *MsgCode    = Node -> Current;
  893.                                                         *MsgGadget    = Gadget;
  894.                                                     }
  895.                                                     else
  896.                                                         *MsgClass = NULL;
  897.                                                 }
  898.                                             }
  899.  
  900.                                             FoundIt = TRUE;
  901.  
  902.                                             break;
  903.  
  904.                                         case STRING_KIND:
  905.                                         case FRACTION_KIND:
  906.                                         case PASSWORD_KIND:
  907.  
  908.                                             if(!KeyUp)
  909.                                             {
  910.                                                 if(Node -> Special . String . Picker && !Forward)
  911.                                                 {
  912.                                                     LTP_BlinkButton(Handle,Node -> Special . String . Picker);
  913.  
  914.                                                     *MsgClass    = IDCMP_IDCMPUPDATE;
  915.                                                     *MsgCode    = 0;
  916.                                                     *MsgGadget    = Gadget;
  917.                                                 }
  918.                                                 else
  919.                                                 {
  920.                                                     ActivateGadget(Gadget,Handle -> Window,NULL);
  921.  
  922.                                                     *MsgClass    = IDCMP_GADGETDOWN;
  923.                                                     *MsgCode    = 0;
  924.                                                     *MsgGadget    = Gadget;
  925.  
  926.                                                     Handle -> Previous = Gadget;
  927.                                                 }
  928.                                             }
  929.                                             else
  930.                                                 *MsgClass = NULL;
  931.  
  932.                                             FoundIt = TRUE;
  933.  
  934.                                             break;
  935.  
  936.                                         case INTEGER_KIND :
  937.  
  938.                                             if(!KeyUp)
  939.                                             {
  940.                                                 if(Node -> Special . Integer . UseIncrementers)
  941.                                                 {
  942.                                                     ObjectNode    *incNode,*Parent = (ObjectNode *)Gadget -> UserData;
  943.                                                     LONG         Number;
  944.                                                     struct Gadget    *Incrementer;
  945.  
  946.                                                     if(Forward)
  947.                                                     {
  948.                                                         incNode = Node -> Special . Integer . RightIncrementer -> UserData;
  949.  
  950.                                                         Incrementer = Node -> Special . Integer . RightIncrementer;
  951.                                                     }
  952.                                                     else
  953.                                                     {
  954.                                                         incNode = Node -> Special . Integer . LeftIncrementer -> UserData;
  955.  
  956.                                                         Incrementer = Node -> Special . Integer . LeftIncrementer;
  957.                                                     }
  958.  
  959.                                                     if(Parent -> Special . Integer . IncrementerHook)
  960.                                                         Number = CallHookPkt(Parent -> Special . Integer . IncrementerHook,(APTR)LT_GetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,TAG_DONE),incNode -> Special . Incrementer . Amount < 0 ? (APTR)INCREMENTERMSG_DECREMENT : (APTR)INCREMENTERMSG_INCREMENT);
  961.                                                     else
  962.                                                         Number = LT_GetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,TAG_DONE) + incNode -> Special . Incrementer . Amount;
  963.  
  964.                                                     if(Number >= Parent -> Min && Number <= Parent -> Max)
  965.                                                     {
  966.                                                         LTP_BlinkButton(Handle,Incrementer);
  967.  
  968.                                                         LT_SetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,GTIN_Number,Number,TAG_DONE);
  969.  
  970.                                                         *MsgClass = IDCMP_GADGETUP;
  971.  
  972.                                                         LTP_PutStorage(Node);
  973.                                                     }
  974.                                                 }
  975.                                                 else
  976.                                                 {
  977.                                                     ActivateGadget(Gadget,Handle -> Window,NULL);
  978.  
  979.                                                     *MsgClass = IDCMP_GADGETDOWN;
  980.                                                 }
  981.  
  982.                                                 *MsgCode    = 0;
  983.                                                 *MsgGadget    = Gadget;
  984.  
  985.                                                 Handle -> Previous = Gadget;
  986.                                             }
  987.                                             else
  988.                                                 *MsgClass = NULL;
  989.  
  990.                                             FoundIt = TRUE;
  991.  
  992.                                             break;
  993.  
  994.                                         case BUTTON_KIND:
  995.  
  996.                                             if(!KeyUp && !(MsgQualifier & IEQUALIFIER_REPEAT))
  997.                                             {
  998.                                                 LTP_BlinkButton(Handle,Gadget);
  999.  
  1000.                                                 *MsgClass    = IDCMP_GADGETUP;
  1001.                                                 *MsgCode    = 0;
  1002.                                                 *MsgGadget    = Gadget;
  1003.                                             }
  1004.                                             else
  1005.                                                 *MsgClass = NULL;
  1006.  
  1007.                                             FoundIt = TRUE;
  1008.  
  1009.                                             break;
  1010.                                     }
  1011.                                 }
  1012.                             }
  1013.                         }
  1014.                     }
  1015.                 }
  1016.  
  1017.                 if(FoundIt)
  1018.                     Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  1019.             }
  1020.  
  1021.             break;
  1022.         }
  1023.  
  1024.         case IDCMP_GADGETDOWN:
  1025.  
  1026.             if(GETOBJECT((*MsgGadget),Node))
  1027.             {
  1028.                 if(Node -> Type != LISTVIEW_KIND)
  1029.                     Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  1030.  
  1031.                 switch(Node -> Type)
  1032.                 {
  1033. #ifdef DO_LEVEL_KIND
  1034.                     case LEVEL_KIND:
  1035.  
  1036.                         Handle -> CurrentLevel = Node;
  1037.  
  1038.                         break;
  1039. #endif    /* DO_LEVE_KIND */
  1040.                     case STRING_KIND:
  1041.                     case INTEGER_KIND:
  1042.                     case FRACTION_KIND:
  1043.                     case PASSWORD_KIND:
  1044.  
  1045.                         Handle -> Previous = *MsgGadget;
  1046.                         break;
  1047. #ifdef DO_TAPEDECK_KIND
  1048.                     case TAPEDECK_KIND:
  1049.  
  1050.                         if(Node -> Special . TapeDeck . Toggle)
  1051.                         {
  1052.                             if((*MsgGadget) -> Flags & GFLG_SELECTED)
  1053.                                 *MsgCode = TRUE;
  1054.                             else
  1055.                                 *MsgCode = FALSE;
  1056.  
  1057.                             Node -> Current = *MsgCode;
  1058.  
  1059.                             LTP_PutStorage(Node);
  1060.  
  1061.                             if(Handle -> Previous && !Node -> PageSelector)
  1062.                                 Activate = TRUE;
  1063.  
  1064.                             *MsgClass = IDCMP_GADGETUP;
  1065.                         }
  1066.                         else
  1067.                             *MsgClass = NULL;
  1068.  
  1069.                         break;
  1070. #endif    /* DO_TAPEDECK_KIND */
  1071.                     case MX_KIND:
  1072.  
  1073.                         if(!V39 && Node -> Disabled)
  1074.                         {
  1075.                             GT_SetGadgetAttrs(*MsgGadget,Handle -> Window,NULL,
  1076.                                 GTMX_Active,Node -> Current,
  1077.                             TAG_DONE);
  1078.  
  1079.                             *MsgClass = NULL;
  1080.                         }
  1081.                         else
  1082.                         {
  1083.                             Node -> Current = *MsgCode;
  1084.  
  1085.                             LTP_PutStorage(Node);
  1086.  
  1087.                             if(Node -> Special . Radio . AutoPageID != -1)
  1088.                             {
  1089.                                 LT_SetAttributes(Handle,Node -> Special . Radio . AutoPageID,
  1090.                                     LAGR_ActivePage,Node -> Current,
  1091.                                 TAG_DONE);
  1092.  
  1093.                                 if(Handle -> Failed)
  1094.                                     *MsgClass = IDCMP_CLOSEWINDOW;
  1095.                                 else
  1096.                                     *MsgClass = NULL;
  1097.                             }
  1098.  
  1099.                             if(Handle -> Previous && !Node -> PageSelector)
  1100.                                 Activate = TRUE;
  1101.                         }
  1102.  
  1103.                         break;
  1104.  
  1105.                     case SLIDER_KIND:
  1106.  
  1107.                         if(Node -> Min < 0)
  1108.                             Node -> Current = (WORD)*MsgCode;
  1109.                         else
  1110.                             Node -> Current = *MsgCode;
  1111.  
  1112.                         LTP_PutStorage(Node);
  1113.  
  1114.                         if(Handle -> Previous && !Node -> PageSelector)
  1115.                             Activate = TRUE;
  1116.  
  1117.                         break;
  1118.  
  1119.                     case SCROLLER_KIND:
  1120.  
  1121.                         Node -> Current = *MsgCode;
  1122.  
  1123.                         LTP_PutStorage(Node);
  1124.  
  1125.                         if(Handle -> Previous && !Node -> PageSelector)
  1126.                             Activate = TRUE;
  1127.  
  1128.                         break;
  1129.  
  1130.                     case INCREMENTER_KIND:
  1131.  
  1132.                         Handle -> ActiveIncrementer    = Node;
  1133.                         Handle -> IncrementerCountdown    = 6;
  1134.  
  1135.                         *MsgClass    = IDCMP_GADGETUP;
  1136.                         *MsgCode    = 0;
  1137.                         *MsgGadget    = Node -> Special . Incrementer . Parent;
  1138.  
  1139.                         /* ALWAYS */
  1140.                         {
  1141.                             struct ObjectNode    *Parent = (ObjectNode *)(*MsgGadget) -> UserData;
  1142.                             LONG             Number;
  1143.  
  1144.                             if(Parent -> Special . Integer . IncrementerHook)
  1145.                                 Number = CallHookPkt(Parent -> Special . Integer . IncrementerHook,(APTR)LT_GetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,TAG_DONE),Node -> Special . Incrementer . Amount < 0 ? (APTR)INCREMENTERMSG_DECREMENT : (APTR)INCREMENTERMSG_INCREMENT);
  1146.                             else
  1147.                                 Number = LT_GetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,TAG_DONE) + Node -> Special . Incrementer . Amount;
  1148.  
  1149.                             if(Number >= Parent -> Min && Number <= Parent -> Max)
  1150.                                 LT_SetAttributes(Handle,Parent -> ID,LAPR_Object,Parent,GTIN_Number,Number,TAG_DONE);
  1151.                             else
  1152.                                 *MsgClass = NULL;
  1153.                         }
  1154.  
  1155.                         break;
  1156.                 }
  1157.             }
  1158.  
  1159.             break;
  1160.  
  1161.         case IDCMP_MOUSEBUTTONS:
  1162.  
  1163.             if(((*MsgCode) & IECODE_UP_PREFIX) && Handle -> Previous)
  1164.                 Activate = TRUE;
  1165.  
  1166.             if((*MsgCode == SELECTUP) && (Handle -> ActiveIncrementer))
  1167.                 Handle -> ActiveIncrementer = NULL;
  1168.  
  1169.             break;
  1170.  
  1171.         case IDCMP_GADGETUP:
  1172.  
  1173. #ifdef DO_LEVEL_KIND
  1174.             Handle -> CurrentLevel = NULL;
  1175. #endif    /* DO_LEVEL_KIND */
  1176.  
  1177.             if(GETOBJECT((*MsgGadget),Node))
  1178.             {
  1179.                 if(Node -> Type != LISTVIEW_KIND)
  1180.                     Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  1181.  
  1182.                 switch(Node -> Type)
  1183.                 {
  1184.                     case FRACTION_KIND:
  1185.  
  1186.                         LT_SetAttributes(Handle,(*MsgGadget) -> GadgetID,LAFC_Number,LT_GetAttributes(Handle,(*MsgGadget) -> GadgetID,TAG_DONE),TAG_DONE);
  1187.  
  1188.                     /* FALLS THROUGH */
  1189.  
  1190.                     case PASSWORD_KIND:
  1191.                     case STRING_KIND:
  1192.  
  1193.                         LTP_PutStorage(Node);
  1194.  
  1195.                         if(*MsgCode == 0x5F && Handle -> HelpHook)
  1196.                         {
  1197.                             struct HelpMsg     Message;
  1198.                             struct IBox     Box;
  1199.  
  1200.                             Message . ObjectID = Node -> ID;
  1201.  
  1202.                             Box . Left    = Node -> Left;
  1203.                             Box . Top    = Node -> Top;
  1204.                             Box . Width    = Node -> Width;
  1205.                             Box . Height    = Node -> Height;
  1206.  
  1207.                             Message . Handle = Handle;
  1208.  
  1209.                             CallHookPkt(Handle -> HelpHook,&Message,&Box);
  1210.  
  1211.                             *MsgClass = NULL;
  1212.                         }
  1213.                         else
  1214.                             Handle -> Previous = NULL;
  1215.  
  1216.                         break;
  1217.  
  1218.                     case INTEGER_KIND:
  1219.                     {
  1220.                         struct StringInfo *StringInfo = (struct StringInfo *)(*MsgGadget) -> SpecialInfo;
  1221.                         LONG Contents = StringInfo -> LongInt;
  1222.  
  1223.                         if(Contents < Node -> Min)
  1224.                             Contents = Node -> Min;
  1225.                         else
  1226.                         {
  1227.                             if(Contents > Node -> Max)
  1228.                                 Contents = Node -> Max;
  1229.                         }
  1230.  
  1231.                         LT_SetAttributes(Handle,(*MsgGadget) -> GadgetID,GTIN_Number,Contents,TAG_DONE);
  1232.  
  1233.                         LTP_PutStorage(Node);
  1234.  
  1235.                         if(*MsgCode == 0x5F && Handle -> HelpHook)
  1236.                         {
  1237.                             struct HelpMsg     Message;
  1238.                             struct IBox     Box;
  1239.  
  1240.                             Message . ObjectID = Node -> ID;
  1241.  
  1242.                             Box . Left    = Node -> Left;
  1243.                             Box . Top    = Node -> Top;
  1244.                             Box . Width    = Node -> Width;
  1245.                             Box . Height    = Node -> Height;
  1246.  
  1247.                             Message . Handle = Handle;
  1248.  
  1249.                             CallHookPkt(Handle -> HelpHook,&Message,&Box);
  1250.  
  1251.                             *MsgClass = NULL;
  1252.                         }
  1253.                         else
  1254.                             Handle -> Previous = NULL;
  1255.  
  1256.                         break;
  1257.                     }
  1258.  
  1259.                     case CHECKBOX_KIND:
  1260.  
  1261.                         if(!V39)
  1262.                         {
  1263.                             if((*MsgGadget) -> Flags & GFLG_SELECTED)
  1264.                                 *MsgCode = TRUE;
  1265.                             else
  1266.                                 *MsgCode = FALSE;
  1267.                         }
  1268.  
  1269.                         Node -> Current = *MsgCode;
  1270.  
  1271.                         LTP_PutStorage(Node);
  1272.  
  1273.                         if(Handle -> Previous && !Node -> PageSelector)
  1274.                             Activate = TRUE;
  1275.  
  1276.                         break;
  1277. #ifdef DO_TAPEDECK_KIND
  1278.                     case TAPEDECK_KIND:
  1279.  
  1280.                         if(Node -> Special . TapeDeck . Toggle)
  1281.                         {
  1282.                             if((*MsgGadget) -> Flags & GFLG_SELECTED)
  1283.                                 *MsgCode = TRUE;
  1284.                             else
  1285.                                 *MsgCode = FALSE;
  1286.  
  1287.                             Node -> Current = *MsgCode;
  1288.  
  1289.                             LTP_PutStorage(Node);
  1290.                         }
  1291.  
  1292.                         if(Handle -> Previous && !Node -> PageSelector)
  1293.                             Activate = TRUE;
  1294.  
  1295.                         break;
  1296. #endif    /* DO_TAPEDECK_KIND */
  1297.                     case CYCLE_KIND:
  1298.  
  1299.                         Node -> Current = *MsgCode;
  1300.  
  1301.                         LTP_PutStorage(Node);
  1302.  
  1303.                         if(Handle -> Previous && !Node -> PageSelector)
  1304.                             Activate = TRUE;
  1305.  
  1306.                         if(Node -> Special . Cycle . AutoPageID != -1)
  1307.                         {
  1308.                             LT_SetAttributes(Handle,Node -> Special . Cycle . AutoPageID,
  1309.                                 LAGR_ActivePage,Node -> Current,
  1310.                             TAG_DONE);
  1311.  
  1312.                             if(Handle -> Failed)
  1313.                                 *MsgClass = IDCMP_CLOSEWINDOW;
  1314.                             else
  1315.                                 *MsgClass = NULL;
  1316.                         }
  1317.  
  1318.                         break;
  1319.  
  1320.                     case PALETTE_KIND:
  1321.  
  1322.                         Node -> Current = *MsgCode;
  1323.  
  1324.                         LTP_PutStorage(Node);
  1325.  
  1326.                         if(Handle -> Previous && !Node -> PageSelector)
  1327.                             Activate = TRUE;
  1328.  
  1329.                         break;
  1330.  
  1331.                     case MX_KIND:
  1332.  
  1333.                         if(!V39 && Node -> Disabled)
  1334.                         {
  1335.                             GT_SetGadgetAttrs(*MsgGadget,Handle -> Window,NULL,
  1336.                                 GTMX_Active,Node -> Current,
  1337.                             TAG_DONE);
  1338.  
  1339.                             *MsgClass = NULL;
  1340.                         }
  1341.                         else
  1342.                         {
  1343.                             Node -> Current = *MsgCode;
  1344.  
  1345.                             LTP_PutStorage(Node);
  1346.  
  1347.                             if(Node -> Special . Radio . AutoPageID != -1)
  1348.                             {
  1349.                                 LT_SetAttributes(Handle,Node -> Special . Radio . AutoPageID,
  1350.                                     LAGR_ActivePage,Node -> Current,
  1351.                                 TAG_DONE);
  1352.  
  1353.                                 if(Handle -> Failed)
  1354.                                     *MsgClass = IDCMP_CLOSEWINDOW;
  1355.                                 else
  1356.                                     *MsgClass = NULL;
  1357.                             }
  1358.  
  1359.                             if(Handle -> Previous && !Node -> PageSelector)
  1360.                                 Activate = TRUE;
  1361.                         }
  1362.  
  1363.                         break;
  1364.  
  1365.                     case SLIDER_KIND:
  1366.  
  1367.                         if(Node -> Min < 0)
  1368.                             Node -> Current = (WORD)*MsgCode;
  1369.                         else
  1370.                             Node -> Current = *MsgCode;
  1371.  
  1372.                         LTP_PutStorage(Node);
  1373.  
  1374.                         if(Handle -> Previous && !Node -> PageSelector)
  1375.                             Activate = TRUE;
  1376.  
  1377.                         break;
  1378. #ifdef DO_LEVEL_KIND
  1379.                     case LEVEL_KIND:
  1380.  
  1381.                         *MsgClass    = IDCMP_MOUSEMOVE;
  1382.                         *MsgCode    = Node -> Special . Level . Level;
  1383.                         *MsgGadget    = Node -> Host;
  1384.  
  1385.                         LTP_PutStorage(Node);
  1386.  
  1387.                         break;
  1388. #endif    /* DO_LEVEL_KIND */
  1389.                     case SCROLLER_KIND:
  1390.  
  1391.                         Node -> Current = *MsgCode;
  1392.  
  1393.                         LTP_PutStorage(Node);
  1394.  
  1395.                         if(Handle -> Previous && !Node -> PageSelector)
  1396.                             Activate = TRUE;
  1397.  
  1398.                         break;
  1399.  
  1400.                     case PICKER_KIND:
  1401.  
  1402.                         *MsgClass    = IDCMP_IDCMPUPDATE;
  1403.                         *MsgCode    = 0;
  1404.                         *MsgGadget    = Node -> Special . Picker . Parent;
  1405.  
  1406.                         if(Handle -> Previous && !Node -> PageSelector)
  1407.                             Activate = TRUE;
  1408.  
  1409.                         break;
  1410.  
  1411.                     case INCREMENTER_KIND:
  1412.  
  1413.                         Handle -> ActiveIncrementer = NULL;
  1414.                         break;
  1415.  
  1416.                     case LISTVIEW_KIND:
  1417.  
  1418.                         if(Node -> Current != *MsgCode || Node != Handle -> ClickObject)
  1419.                         {
  1420.                             CurrentTime(&Handle -> ClickSeconds,&Handle -> ClickMicros);
  1421.  
  1422.                             Handle -> ClickObject = Node;
  1423.                         }
  1424.                         else
  1425.                         {
  1426.                             ULONG Seconds,Micros;
  1427.  
  1428.                             CurrentTime(&Seconds,&Micros);
  1429.  
  1430.                             if(DoubleClick(Handle -> ClickSeconds,Handle -> ClickMicros,Seconds,Micros))
  1431.                                 *MsgClass = IDCMP_IDCMPUPDATE;
  1432.  
  1433.                             Handle -> ClickSeconds    = Seconds;
  1434.                             Handle -> ClickMicros    = Micros;
  1435.                         }
  1436.  
  1437.                         Node -> Current = *MsgCode;
  1438.  
  1439.                         LTP_PutStorage(Node);
  1440.  
  1441.                         if(Node -> Special . List . Link)
  1442.                         {
  1443.                             Handle -> Previous = Node -> Special . List . Link;
  1444.  
  1445.                             if(!Node -> PageSelector)
  1446.                                 Activate = TRUE;
  1447.                         }
  1448.                         else
  1449.                         {
  1450.                             if(Handle -> Previous && !Node -> PageSelector)
  1451.                                 Activate = TRUE;
  1452.                         }
  1453.  
  1454.                         break;
  1455.  
  1456.                     default:
  1457.  
  1458.                         if(Handle -> Previous && !Node -> PageSelector)
  1459.                             Activate = TRUE;
  1460.  
  1461.                         break;
  1462.                 }
  1463.             }
  1464.  
  1465.             break;
  1466.  
  1467.         case IDCMP_MOUSEMOVE:
  1468.  
  1469. #ifdef DO_LEVEL_KIND
  1470.             if(Handle -> CurrentLevel)
  1471.                 Node = Handle -> CurrentLevel;
  1472.             else
  1473. #endif
  1474.                 GETOBJECT((*MsgGadget),Node);
  1475.  
  1476.             if(Node)
  1477.             {
  1478.                 if(Node -> Type != LISTVIEW_KIND)
  1479.                     Handle -> ClickSeconds = Handle -> ClickMicros = 0;
  1480.  
  1481.                 switch(Node -> Type)
  1482.                 {
  1483.                     case SLIDER_KIND:
  1484.  
  1485.                         if(Node -> Min < 0)
  1486.                             Node -> Current = (WORD)*MsgCode;
  1487.                         else
  1488.                             Node -> Current = *MsgCode;
  1489.  
  1490.                         LTP_PutStorage(Node);
  1491.  
  1492.                         break;
  1493.  
  1494.                     case SCROLLER_KIND:
  1495.  
  1496.                         Node -> Current = *MsgCode;
  1497.  
  1498.                         LTP_PutStorage(Node);
  1499.  
  1500.                         break;
  1501.  
  1502. #ifdef DO_LEVEL_KIND
  1503.                     case LEVEL_KIND:
  1504.  
  1505.                         *MsgCode    = Node -> Special . Level . Level;
  1506.                         *MsgGadget      = Node -> Host;
  1507.  
  1508.                         LTP_PutStorage(Node);
  1509.  
  1510.                         break;
  1511. #endif    /* DO_LEVEL_KIND */
  1512.                 }
  1513.             }
  1514.  
  1515.             break;
  1516.  
  1517.         case IDCMP_ACTIVEWINDOW:
  1518.  
  1519.             if(Handle -> Previous)
  1520.             {
  1521.                 Activate = TRUE;
  1522.  
  1523.                 *MsgClass    = IDCMP_GADGETDOWN;
  1524.                 *MsgCode    = 0;
  1525.                 *MsgGadget    = Handle -> Previous;
  1526.             }
  1527.  
  1528.             break;
  1529.  
  1530.         case IDCMP_INACTIVEWINDOW:
  1531.  
  1532.             Handle -> ActiveIncrementer = NULL;
  1533.             break;
  1534.     }
  1535.  
  1536.     if(Handle -> AutoActivate && Activate && Handle -> Previous)
  1537.     {
  1538.         if(GETOBJECT(Handle -> Previous,Node))
  1539.         {
  1540.             if(!Node -> Disabled)
  1541.                 ActivateGadget(Handle -> Previous,Handle -> Window,NULL);
  1542.         }
  1543.     }
  1544. }
  1545.